package com.huangfu.learning.javabase.java.callback;

/**
 * Created with IntelliJ IDEA.
 * Author: huangfu.daohui
 * Date: 2018/7/21
 * Time: 11:22
 * Version: 1.0
 * Description:
 * 所谓回调，就是客户程序client调用服务程序server中的某个函数sa，
 * 然后server又在某个时候反过来调用client中的某个函数cb，对于client来说，这个cb便叫做回调函数
 * <p>
 * 使用技巧：定一个接口，在接口中声明我们想调用的方法。
 * 在另一个方法中注册刚定义的回调接口
 **/
public class CallbackPractice {
    public static void main(String[] args) {
        int amount = 200;
        String account = "huangfu";
        WechatClient wechatClient = new WechatClient(amount, account);
        wechatClient.forRecharge();
    }
}

//完成充值后回调函数需要执行的内容
interface ServerCallbackInterface {
    //回调函数
    void sendMessage(int amount, String account);
}


/**
 * 服务端 WechatServer
 * 服务器端需要完成客户端的调用
 * 并且进行回调   注意这里回调就是指的短信提示
 * 并且服务器端需要提供制定的回调方法，这就意味着所有的客户端都需要实现定义的接口
 *
 * @author libo
 */
class WechatServer {
    public void recharge(int amount, String account, ServerCallbackInterface wechatClient) {
        System.out.println("服务器端开始进行充值操作");
        try {
            // 假设这里是充值操作
            Thread.currentThread().sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("充值完成");
        //充值操作完成之后需要调用客户端的回调函数通知客户端
        wechatClient.sendMessage(amount, account);
    }

}


//客户端
class WechatClient implements ServerCallbackInterface {
    private int amount; //充值金额
    private String account; //终充值账户

    public WechatClient(int amount, String account) {
        this.amount = amount;
        this.account = account;
    }

    @Override
    public void sendMessage(int amount, String account) {
        System.out.println("回调函数执行：客户:" + account + "完成账户充值，金额：" + amount);
    }

    //调用服务器端进行充值
    public void forRecharge() {
        System.out.println("客户端开始调用服务器端进行充值");
        new WechatServer().recharge(amount, account, this);
    }


}
